DynamoDBのupdateItemを、AttributeUpdatesではなくUpdateExpressionで行う
丹内です。
DynamoDBのAtomic CounterをインクリメントするLambda Functionを、以下のように書きました。
var aws = require('aws-sdk'); var dynamodb = new aws.DynamoDB({apiVersion: '2012-08-10'}); exports.handler = function(event, context) { var params = { TableName: 'mytable', Key: {count:{S:"mycount"}}, AttributeUpdates: { mycount: { Action: 'ADD', Value: {N: '1'} } } }; dynamodb.updateItem(params, function(err, data){ if(err) { context.done('error' + err); } else { context.succeed(); } }) };
その後諏訪さんのレビューを受けた際に、updateItemのパラメータにAttributeUpdatesを使うのは非推奨であるとの指摘を頂きました。
ドキュメントを見ると、確かにそのように書いてあります。
There is a newer parameter available. Use UpdateExpression instead.
そこで、推奨されているUpdateExpressionを使って以下のように書きなおしました。
var aws = require('aws-sdk'); var dynamodb = new aws.DynamoDB({apiVersion: '2012-08-10'}); exports.handler = function(event, context) { var params = { TableName: 'mytable', Key: {count:{S:'mycount'}}, UpdateExpression: 'set #count = #count + :i', ExpressionAttributeNames: {'#count': 'mycount'}, ExpressionAttributeValues: {':i': {'N': '1'}} }; dynamodb.updateItem(params, function(err, data) { if(err) { context.done('error' + err); } else { context.succeed(); } }) };
どちらのLambda Functionも同じように動作します。
個人的には、パラメータで指定するよりも式で書けたほうが、分かりやすくて好みです。
updateItemだけでなく、putItemでも条件を記述する方法がConditionalOperatorではなくConditionExpressionが推奨されているようでした。